---
title: 如何在安装 Debian 时配置 Btrfs 子卷 | 详细分步指南
description: 通过本教程学习在 Debian 安装过程中设置 Btrfs 子卷的最佳实践，掌握快照管理、系统分区优化技巧，适用于新手和有经验的 Linux 用户
date: "2025-04-29"
lang: zh
tags:
  - Debian
  - 环境配置
  - Btrfs
category: 技术
cover: https://cdn.qladgk.com/images/20250508161434413.png
---

import Image from "@/components/mdx/Image";

<Image
  src="https://cdn.qladgk.com/images/20250508161434413.png"
  alt="cover"
  width={999}
  height={527}
  isArticleImage={true}
/>

## 为什么是 Btrfs 子卷？

### Btrfs vs ext4：现代文件系统的优势

Btrfs（B-Tree File System）相比传统 ext4 具备以下核心特性：

- ‌写时复制 (CoW)‌：修改文件时保留原数据，避免意外覆盖
- 子卷 (Subvolume)‌：可独立挂载的逻辑分区（类似"文件夹中的文件系统"）
- ‌透明压缩‌：节省存储空间（支持 zstd/lzo 算法）
- ‌实时快照‌：秒级创建系统还原点（需配合子卷使用）

### 为什么必须使用子卷？

直接使用 Btrfs 根卷会导致：

- 快照工具（如Timeshift）无法区分系统文件和用户数据
- 系统更新/回滚时可能破坏重要配置
- 无法实现精细化空间配额管理

总而言之，你用滚动发行版比如 Arch、Debian sid 等就建议你用 btrfs 文件系统，创造布局合理的子卷才能充分提高 Btrfs 各方面的使用效率

## 安装步骤：手动创建子卷流程

### 前置准备

1. 下载最新 Debian ISO
2. 制作启动U盘（推荐使用 Ventoy）

### 关键操作节点

如果你使用图形界面安装的过程中是看不到子卷的操作的，解决方法也很简单，直接 Ctrl + Alt + F1~7 换一个 tty 就行

具体步骤如下：

0. 启动 Live 后选择高级中的专家模式（建议、方便操作）
1. 启动安装程序并完成基本设置如语言、时区、键盘
2. 进入‌分区向导‌步骤时选择 btrfs 文件系统，并且分好 efi、根目录、交互空间等分区
3. 在进行到安装基本系统时停止操作

你的鼠标应该停在 install base system 选项上：

<Image
  src="https://cdn.qladgk.com/images/20250429175034802.jpg"
  alt="Debian 分区步骤"
  width={666}
  height={527}
  isArticleImage={true}
/>

### TTY 切换 与 手动分区（核心步骤）

按下 Ctrl + Alt + F2 进入 tty2 命令行界面（tty2 不行，你就 F3、F4 一个个试，直到进入一个可执行命令的 tty）

默认应该是按回车就自动登录

接着查看当前挂载的分区

```bash
df -h
```

默认会有一个 /target 和 /target/boot/efi 已挂载，这两个目录是 Debian 安装时的默认目录，后面会用到。

如果装过 Arch 都知道一般会手动把系统安装在 /mnt 里面，只不过 Debian 规定在 /target 里面

然后取消这两个目录的挂载

```bash
# 顺序不能反，不然会繁忙
umount /target/boot/efi/
umount /target/
```

最后可以再次查看挂载状态

完整截图如下：

<Image
  src="https://cdn.qladgk.com/images/20250429180814985.jpg"
  alt="取消挂载 Debian 已有目录"
  width={666}
  height={527}
  isArticleImage={true}
/>

然后将你的 btrfs 分区挂载到随便的一个目录，比如说 `/mnt`

```bash
mount /dev/nvme0n1p3 /mnt
```

进入 `/mnt` 后查看这个目录下的文件会发现有一个 `@rootfs`

这是你在分区操作中选择 btrfs 文件系统时自动创建的单子卷布局，而我这里选择的是扁平化布局即 `@` `@home` `@xxx` 等

以下是两种布局的差异

| 特性            | 单子卷布局（@rootfs）                                           | 扁平化布局（@/@home/@snapshots）                                  |
| --------------- | --------------------------------------------------------------- | ----------------------------------------------------------------- |
| ‌结构特点‌      | 仅包含单个根子卷@rootfs，所有系统文件、用户数据均存储在该子卷内 | 将根目录、用户目录、快照存储等拆分为独立子卷，形成平行结构        |
| ‌快照管理‌      | 需对整个根卷快照，无法单独回滚/home等目录                       | 可针对@（系统）或@home（用户数据）单独创建/恢复快照，实现精准回滚 |
| ‌ 空间配额‌     | 无法对子目录设置独立配额                                        | 可对每个子卷分配独立存储空间（btrfs qgroup）                      |
| ‌ 系统更新影响‌ | 用户数据与系统文件混合存储，系统升级失败可能导致数据丢失        | 用户数据（@home）与系统（@）隔离，降低操作风险                    |

那既然都是卷，为什么不直接在 `@rootfs` 上创建子卷呢？

可以直接在 `@rootfs` 上创建子卷，但是会形成层级化布局，也称嵌套子卷

层级化布局的目录结构如下

```markdown
@rootfs
├── home（子卷）
├── snapshots（子卷）
└── 其他系统文件
```

层级化布局的局限性：

- ‌快照依赖关系‌：快照 @rootfs 时会包含其下所有嵌套子卷，无法单独管理
- 挂载复杂度‌：需通过 subvolid 或 subvol=@rootfs/home 路径挂载，易出错
- 工具兼容性‌：部分工具（如Timeshift）可能无法正确识别嵌套子卷结构

所以我这里优先选择扁平化布局，目录结构如下所示

```markdown
.
├── @
├── @home
├── @snapshots
└── @其他系统文件
```

首先将 @rootfs 重命名为 @

```bash
mv @rootfs @
```

然后按自己的需求创建平行子卷

```bash
btrfs subvolume create /mnt/@home # 我这里就只创建一个用户数据的卷
btrfs subvolume create /mnt/@xxxxx
```

创建完成后通过 list 参数查看子卷

```bash
btrfs subvolume list -p /mnt
```

完整截图如下：

<Image
  src="https://cdn.qladgk.com/images/20250429184151198.jpg"
  alt="创建平行子卷"
  width={666}
  height={527}
  isArticleImage={true}
/>

子卷创建完成之后就可以重新将分区挂载到 /target 等目录

```bash
# 先创建子卷对应文件夹
mkdir /target/home
mkdir /target/xxxxx

# 挂载子卷（可选择 zstd 压缩等特性）
mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p3 /target
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p3 /target/home

# 挂载 efi 分区
mount /dev/nvme0n1p1 /target/boot/efi

# 查看挂载状态
df -h
```

完整截图如下：

<Image
  src="https://cdn.qladgk.com/images/20250429184935739.jpg"
  alt="重新挂载分区"
  width={666}
  height={527}
  isArticleImage={true}
/>

为了安装后的系统能正确启动和识别 btrfs 子卷，必须要修改 fstab 文件

注意点就是把 @rootfs 改成 @，新加你创建的子卷行，当然你也可以加 zstd 等特性

<Image
  src="https://cdn.qladgk.com/images/20250429185234710.jpg"
  alt="修改 fstab 文件"
  width={666}
  height={527}
  isArticleImage={true}
/>

最后推出当前 tty

```bash
exit
```

接着按 Ctrl + Alt + F1 进入 tty1 图形界面（tty1 不行，你就 F3、F4 一个个试）

返回图形界面继续安装完成安装

## 系统安装后的优化配置

### 配置 Timeshift 自动快照

安装必要组件：

```bash
sudo apt install timeshift
sudo apt install cronie
sudo systemctl enable --now cronie.service
```

1. 快照类型选择 BTRFS，点击下一步：

<Image
  src="https://cdn.qladgk.com/images/20250429190844770.png"
  alt="配置快照类型"
  width={666}
  height={527}
  isArticleImage={true}
/>

2. 快照位置选择 BTRFS 分区，点击下一步：

<Image
  src="https://cdn.qladgk.com/images/20250429190905203.png"
  alt="配置快照位置"
  width={666}
  height={527}
  isArticleImage={true}
/>

> Timeshift 只支持扁平化布局，如果你是单子卷或嵌套子卷则不能使用

3. 选择快照计划

Debian sid 建议每天、每周、每月

<Image
  src="https://cdn.qladgk.com/images/20250429190940329.png"
  alt="选择快照计划"
  width={666}
  height={527}
  isArticleImage={true}
/>

4. 选择是否包含用户数据

<Image
  src="https://cdn.qladgk.com/images/20250429190436219.png"
  alt="选择快照计划"
  width={666}
  height={527}
  isArticleImage={true}
/>

然后现在手动创建一个快照，会发现瞬间完成，这就是写时复制（Copy-on-Write，CoW） 机制

可以通过以下命令查看快照存放的位置

```bash
sudo timeshift --list
```

<Image
  src="https://cdn.qladgk.com/images/20250429192120176.png"
  alt="快照的位置"
  width={999}
  height={527}
  isArticleImage={true}
/>

Timeshift 默认备份的快照位置是在同一个 btrfs 分区，默认是在 @snapshots 子卷中（如果你之前创建过）

因为我没有创建 @snapshots 子卷，所以备份的位置在 `/run/timeshift/329018/backup`

通过查看这个目录发现占用 29G，没错 29G 就是这么快

<Image
  src="https://cdn.qladgk.com/images/20250429192920379.png"
  alt="快照的大小"
  width={999}
  height={527}
  isArticleImage={true}
/>

虽然这样可以快速恢复快照，但是还是有一个潜在的问题，快照的位置和你的 btrfs 分区的位置是同一个，如果你的根分区出现损坏，快照也就没了，timeshift 也就不能恢复了。

为了解决这个问题，你可以考虑将快照备份到另一块磁盘上。
